package com.songtech.uitest.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.testng.IAnnotationTransformer;
import org.testng.IRetryAnalyzer;
import org.testng.ITestResult;
import org.testng.TestListenerAdapter;
import org.testng.annotations.ITestAnnotation;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;

/**
 * 为了实现测试方法的自动重试，需要在每个方法上加注释retryAnalyzer
 * 写了这个类就不用加注释了，它会自动监测，缺的自动补上
 */
public class RetryListener extends TestListenerAdapter implements IAnnotationTransformer  {


    @Override
    public void transform(ITestAnnotation iTestAnnotation, Class aClass, Constructor constructor, Method method) {
        IRetryAnalyzer retry = iTestAnnotation.getRetryAnalyzer();
        if (retry == null)    {
            iTestAnnotation.setRetryAnalyzer(Retry.class);//检查注解中有没有使用RetryAnalyzer，若没有，则将自定义的Retry.class加入到注解中。
        }

    }


    //重写TestListenerAdapter的如下三个方法是为了走自己的日志记录报错后，控制台不要再报一遍错
    @Override
    public void onTestFailure(ITestResult tr) {
        tr.setThrowable(null);
    }

    @Override
    public void onTestSkipped(ITestResult tr) {
        tr.setThrowable(null);
    }

    @Override
    public void onTestSuccess(ITestResult tr) {
        tr.setThrowable(null);
        //如果不加这个，流程出错（非断言）重试后，会跳过后边依赖当前测试方法的测试方法
        tr.getTestContext().getSkippedTests().getAllResults().clear();
    }


}
